package es.uned.ii.si3.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.struts.util.LabelValueBean;

import es.uned.ii.si3.Constantes;
import es.uned.ii.si3.model.Departamento;
import es.uned.ii.si3.model.Profesor;
import es.uned.ii.si3.model.Propuesta;
import es.uned.ii.si3.model.TipoPfc;
import es.uned.ii.si3.model.Usuario;

public class ProfesorDAOImpl implements ProfesorDAO {

	private static Logger log = Logger.getLogger(ProfesorDAOImpl.class);

	
	public ProfesorDAOImpl(){

	}
	
	public Profesor getProfesorByPrimaryKey(int id) {

		UsuarioDAO usuarioDAO = new UsuarioDAOImpl();
		DepartamentoDAO departamentoDAO = new DepartamentoDAOImpl();
		Usuario usuario = usuarioDAO.getUsuarioById(id);
		if ((usuario == null) || (!usuario.getRol().getDescripcion().toLowerCase().equals(Constantes.ROL_PROFESOR.toLowerCase()))) {
			return null;
		}
		
		Profesor profesor = new Profesor(usuario);
		Departamento departamento = departamentoDAO.getDepartamento(profesor);
		if (departamento == null) {
			return null;
		}
		profesor.setDepartamento(departamento);
		
		return profesor;
	}

	
	/**
	 * Inserta un objeto profesor en la pase de datos 
     *
     * @param profesor Objeto que contiene los datos del alumno
     *	@return Long identificador del profesor creado  
     */
	public Long insert(Profesor profesor)  {

		log.debug("ProfesorDAOImpl::insert Vamos a insertar el siguiente profesor: " + profesor.toString());
		Connection conn = ConnectionFactory.getConnection();
		PreparedStatement ptmt = null;
		int idProfesor = -1;

		try {
			ptmt = conn.prepareStatement("INSERT INTO `usuarios`(`idRol`,`login`,`password`,`nombre`,`apellidos`,`dni`,`mail`,`notificaciones`) VALUES(?, ?, ?, ?, ?, ?, ?, ?);");

			ptmt.setLong(1, profesor.getRol().getIdRol());
			ptmt.setString(2, profesor.getLogin());
			ptmt.setString(3, profesor.getPassword());
			ptmt.setString(4, profesor.getNombre());
			ptmt.setString(5, profesor.getApellidos());
			ptmt.setString(6, profesor.getDni());
			ptmt.setString(7, profesor.getMail());
			ptmt.setBoolean(8, profesor.getNotificaciones());
			ptmt.executeUpdate();
			
			//ResultSet rs = ptmt.getGeneratedKeys();
			ResultSet rs = ptmt.executeQuery("SELECT LAST_INSERT_ID()");
			if (rs.next()) {
				idProfesor = rs.getInt(1);
				profesor.setIdUsuario(idProfesor);
			}
			rs.close();
			ptmt.close();
			log.debug("ProfesorDAOImpl::insert. Hemos dado de alta al usuario con id: "+ idProfesor);

			ptmt = conn.prepareStatement("INSERT INTO `datos_profesores`(`idUsuario`,`idDepartamento`) VALUES(?, ?);");
			//Idusuario, idcentro, numExpediente

			ptmt.setLong(1, profesor.getIdUsuario());
			ptmt.setLong(2, profesor.getDepartamento().getIdDepartamento());
			ptmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				ptmt.close();
				ptmt = null; 
			} catch (Exception e) { }
		}
		
		ConnectionFactory.release(conn);
		return new Long (idProfesor);
		
	}

	
	/**
	 * Actualiza los datos del profesor en la pase de datos 
     *
     * @param profesor Objeto que contiene los datos a actualizar
     * @return boolean Indica si se han actualizado los datos correctamente o no          
     */

	
	public boolean update(Profesor profesor)  {
		
		log.debug("ProfesorDAOImpl::update Vamos a actualizar el siguiente profesor: " + profesor.toString());
		Connection conn = ConnectionFactory.getConnection();
		boolean updateOK = false;
		PreparedStatement ptmt = null;
		
		//conn.setAutoCommit(false);
		try{
			ptmt = conn.prepareStatement("update `usuarios` set `idRol`= ?, `login`=?, `password`=?, `nombre`= ?, `apellidos`= ?, `dni`=?, `mail`= ?, `notificaciones` = ? where `idUsuario`= ?;");
			ptmt.setLong(1, profesor.getRol().getIdRol());
			ptmt.setString(2, profesor.getLogin());
			ptmt.setString(3, profesor.getPassword());
			ptmt.setString(4, profesor.getNombre());
			ptmt.setString(5, profesor.getApellidos());
			ptmt.setString(6, profesor.getDni());
			ptmt.setString(7, profesor.getMail());
			ptmt.setBoolean(8, profesor.getNotificaciones());
			ptmt.setLong(9, profesor.getIdUsuario());
			ptmt.executeUpdate();
			ptmt.close();
			log.debug("ProfesorDAOImpl::update El id del profesor es: " + profesor.getIdUsuario());
			
			
			ptmt = conn.prepareStatement("update `datos_profesores` set `idDepartamento`= ? where `idUsuario`= ?;");
			//Idusuario, idcentro, numExpediente
			ptmt.setLong(1, profesor.getDepartamento().getIdDepartamento());
			ptmt.setLong(2, profesor.getIdUsuario());
			log.debug("ProfesorDAOImpl::update El id del profesor es: " + profesor.getIdUsuario());
			ptmt.execute();
			
			updateOK = true;
			
			//conn.commit();
			//conn.setAutoCommit(true);
		}
		catch (SQLException e) {
			//conn.rollback();
			e.printStackTrace();
			updateOK = false;
		} finally {
			try {
				ptmt.close();
				ptmt = null; 
			} catch (Exception e) { }
		}
		ConnectionFactory.release(conn);
		return ((updateOK) ? true : false);
	}
	

	public Profesor getProfesorById(int id) {
		// TODO Auto-generated method stub
		return null;
	}

	public List getAll() {
		Connection conn = ConnectionFactory.getConnection();
		ArrayList<LabelValueBean> listaProfesores=new ArrayList<LabelValueBean>();
		PreparedStatement ptmt = null;
		ResultSet resultado = null;
		
		try{
			
			ptmt = conn.prepareStatement("select * from usuarios us "+
										"where idRol=?");
			ptmt.setInt(1,2);
			resultado = ptmt.executeQuery();
			
			while (resultado.next()){
				String nombreCompleto=resultado.getString("nombre")+" "+resultado.getString("apellidos");
				listaProfesores.add(new LabelValueBean(Integer.toString(resultado.getInt("idUsuario")),nombreCompleto));
			}			
		}catch(SQLException e){
			listaProfesores=null;
			log.error(e);
		} finally {
			try {
				resultado.close();
				resultado = null;
			} catch (Exception e) { }
			
			try {
				ptmt.close();
				ptmt = null; 
			} catch (Exception e) { }
		}
		ConnectionFactory.release(conn);
		return listaProfesores;
		
	}

}
